/********************************************************************* * * Copyright (C) 2002 Andrew Khan * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ***************************************************************************/ package jxl.biff.formula; import java.util.HashMap; /** * An enumeration detailing the Excel parsed tokens * A particular token may be associated with more than one token code */ class Token { /** * The array of values which apply to this token */ public final int[] value; /** * All available tokens, keyed on value */ private static HashMap tokens = new HashMap(20); /** * Constructor * Sets the token value and adds this token to the array of all token * * @param v the biff code for the token */ private Token(int v) { value = new int[] {v}; tokens.put(new Integer(v), this); } /** * Constructor * Sets the token value and adds this token to the array of all token * * @param v the biff code for the token */ private Token(int v1, int v2) { value = new int[] {v1, v2}; tokens.put(new Integer(v1), this); tokens.put(new Integer(v2), this); } /** * Constructor * Sets the token value and adds this token to the array of all token * * @param v the biff code for the token */ private Token(int v1, int v2, int v3) { value = new int[] {v1, v2, v3}; tokens.put(new Integer(v1), this); tokens.put(new Integer(v2), this); tokens.put(new Integer(v3), this); } /** * Constructor * Sets the token value and adds this token to the array of all token * * @param v the biff code for the token */ private Token(int v1, int v2, int v3, int v4) { value = new int[] {v1, v2, v3, v4}; tokens.put(new Integer(v1), this); tokens.put(new Integer(v2), this); tokens.put(new Integer(v3), this); tokens.put(new Integer(v4), this); } /** * Constructor * Sets the token value and adds this token to the array of all token * * @param v the biff code for the token */ private Token(int v1, int v2, int v3, int v4, int v5) { value = new int[] {v1, v2, v3, v4, v5}; tokens.put(new Integer(v1), this); tokens.put(new Integer(v2), this); tokens.put(new Integer(v3), this); tokens.put(new Integer(v4), this); tokens.put(new Integer(v5), this); } /** * Gets the token code for the specified token * * @return the token code. This is the first item in the array */ public byte getCode() { return (byte) value[0]; } /** * Gets the reference token code for the specified token. This is always * the first on the list * * @return the token code. This is the first item in the array */ public byte getReferenceCode() { return (byte) value[0]; } /** * Gets the an alternative token code for the specified token * Used for certain types of volatile function * * @return the token code */ public byte getCode2() { return (byte) (value.length > 0 ? value[1] : value[0]); } /** * Gets the value token code for the specified token. This is always * the second item on the list * * @return the token code */ public byte getValueCode() { return (byte) (value.length > 0 ? value[1] : value[0]); } /** * Gets the type object from its integer value */ public static Token getToken(int v) { Token t = (Token) tokens.get(new Integer(v)); return t != null ? t : UNKNOWN; } // Operands public static final Token REF = new Token(0x44, 0x24, 0x64); public static final Token REF3D = new Token(0x5a, 0x3a, 0x7a); public static final Token MISSING_ARG = new Token(0x16); public static final Token STRING = new Token(0x17); public static final Token ERR = new Token(0x1c); public static final Token BOOL = new Token(0x1d); public static final Token INTEGER = new Token(0x1e); public static final Token DOUBLE = new Token(0x1f); public static final Token REFERR = new Token(0x2a, 0x4a, 0x6a); public static final Token REFV = new Token(0x2c, 0x4c, 0x6c); public static final Token AREAV = new Token(0x2d, 0x4d, 0x6d); public static final Token MEM_AREA = new Token(0x26, 0x46, 0x66); public static final Token AREA = new Token(0x25, 0x65, 0x45); public static final Token NAMED_RANGE = new Token(0x23, 0x43, 0x63); //need 0x23 for data validation references public static final Token NAME = new Token(0x39, 0x59); public static final Token AREA3D = new Token(0x3b, 0x5b); // Unary Operators public static final Token UNARY_PLUS = new Token(0x12); public static final Token UNARY_MINUS = new Token(0x13); public static final Token PERCENT = new Token(0x14); public static final Token PARENTHESIS = new Token(0x15); // Binary Operators public static final Token ADD = new Token(0x3); public static final Token SUBTRACT = new Token(0x4); public static final Token MULTIPLY = new Token(0x5); public static final Token DIVIDE = new Token(0x6); public static final Token POWER = new Token(0x7); public static final Token CONCAT = new Token(0x8); public static final Token LESS_THAN = new Token(0x9); public static final Token LESS_EQUAL = new Token(0xa); public static final Token EQUAL = new Token(0xb); public static final Token GREATER_EQUAL = new Token(0xc); public static final Token GREATER_THAN = new Token(0xd); public static final Token NOT_EQUAL = new Token(0xe); public static final Token UNION = new Token(0x10); public static final Token RANGE = new Token(0x11); // Functions public static final Token FUNCTION = new Token(0x41, 0x21, 0x61); public static final Token FUNCTIONVARARG = new Token(0x42, 0x22, 0x62); // Control public static final Token ATTRIBUTE = new Token(0x19); public static final Token MEM_FUNC = new Token(0x29, 0x49, 0x69); // Unknown token public static final Token UNKNOWN = new Token(0xffff); }